perm filename GEMSUB[GEO,BGB]1 blob
sn#080253 filedate 1974-01-10 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00011 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 TITLE GEMSUB GEOMETRIC MODELING SYSTEM SUBROUTINES.
C00004 00003 TITLE ARITH - ARITHMETIC ROUTINES.
C00007 00004 SUBR(SIN)
C00009 00005 SUBR(ATAN,X) ARC TANGENT
C00012 00006 SUBR(ATAN2,DY,DX) ARC TANGENT (DELTA-Y,DELTA-X)
C00015 00007 TITLE III - III DISPLAY SUBROUTINES - BGB - JANUARY 1973.
C00016 00008 SUBRS DPYSET,DPYBIG,DPYBRT Set buffer,char. size, brightness*
C00018 00009 SUBRS AVECT,AIVECT,RVECT,RIVECT Vectors
C00021 00010 SUBRS DPYSTR,DTYO,DPYOUT Output string,character, POG *
C00023 00011 SUBRS OCTDPY,DECDPY,FLODPY Numeric display *
C00026 ENDMK
C⊗;
TITLE GEMSUB; GEOMETRIC MODELING SYSTEM SUBROUTINES.
INTERNAL FATAL.,WARN.
EXTERNAL PDL
EXTERNAL JOBCNI,JOBAPR,JOBTPC,JOBREL,JOBHRL,JOBDDT
EXTERNAL JOBREN,JOBOPC,JOBSA
P←17
;FATAL ERROR MESSAGE.
FATAL.: OUTSTR[BYTE(7)15,12,106,101,124↔"AL - "⊗1↔0]
LAC 0,@(P)↔OUTSTR @0↔INCHRW↔GO .-1↔LIT
WARN.: OUTSTR[BYTE(7)15,12,(21)"WAR"↔"NING "⊗1↔0]
LAC 0,@(P)↔OUTSTR @0↔INCHRW↔GO .-1↔LIT
;TITLE ARITH - ARITHMETIC ROUTINES.
HALFPI↑: 201622077325 ;PI/2
PI↑: 202622077325 ;PI
TWOPI↑: 203622077325 ;2*PI
SUBR(SQRT,X) ;SQUARE ROOT OF ABS(X).
COMMENT ⊗------------------------------------------------------------
⊗
A←←0 ↔ B←←1 ↔ C←←2
LACM B,X↔JUMPE B,POP1J.↔PUSHP 2
;LET X=F*(2↑2B) WHERE 0.25<F<1.00 THEN SQRT(X)=SQRT(F)*(2↑B).
ASHC B,-=27↔SUBI B,201 ;GET EXPONENT IN B, FRACTION IN C.
ROT B,-1 ;CUT EXP IN HALF, SAVE ODD BIT
DAP B,L↔LSH B,-=35 ;USE THAT ODD BIT.
ASH C,-10↔FSC C,177(B) ;0.25 < FRACTION < 1.00
;LINEAR APPROXIMATION TO SQRT(F).
DAC C,A
FMP C,[0.8125↔0.578125](B)
FAD C,[0.302734↔0.421875](B)
;TWO ITERATIONS OF NEWTON'S METHOD.
LAC B,A
FDV B,C↔FAD C,B↔FSC C,-1
FDV A,C↔FADR A,C
L: FSC A,0↔LAC 1,A↔POPP 2
POP1J
ENDR SQRT; BGB 28 DECEMBER 1972 -------------------------------------
SUBR(LOG,X) ;NATURAL LOGRITHM.
COMMENT ⊗------------------------------------------------------------
⊗
MOVM X↔SKIPE 1,0↔CAMN 0,[1.0]↔POP1J
ASHC 0,-33↔ADDI 0,211000↔MOVSM 0,TMP1#
MOVSI 0,(-128.5)↔FADM 0,TMP1
ASH 1,-10↔TLC 1,200000↔FAD 1,[-0.70710678]
LAC 0,1↔FAD 0,[1.4142135]↔FDV 1,0
DAC 1,TMP2#↔FMP 1,1
LAC 0,[0.59897864]↔FMP 0,1
FAD 0,[0.96147063]↔FMP 0,1
FAD 0,[2.88539120]↔FMP 0,TMP2↔FAD 0,TMP1
FMP 0,[0.69314718]↔LAC 1,0↔POP1J
VAR
ENDR LOG;---------------------------------------------------------
SUBR(SIN)
GO SIN.↔ENDR SIN
SUBR(COS)
GO COS.↔ENDR COS
BEGIN SINCOS ;MODIFIED OLDE LIB40 SINE & COSINE - BGB.
A←←1 ↔ B←←2 ↔ C←←3
↑COS.: SKIPA A,ARG1
↑SIN.: SKIPA A,ARG1
FADR A,HALFPI ;COS(X) = SIN(X+π/2).
MOVM B,A↔CAMG B,[17B5]↔POP1J ;FOR SMALL X, SIN(X)=X.
;B ← (ABS(X)MODULO 2π)/HALFPI
;C ← QUADRANT 0, 1, 2 OR 3.
FDVR B,HALFPI
LAC C,B↔FIX C,233000
CAILE C,3↔GO[
TRZ C,3↔FSC C,233
FSBR B,C↔GO .-3] ;MODULO 2π.
GO .+1(C)↔GO .+4↔JFCL↔GO[
FSBRI B,(2.0)↔MOVNS B↔GO .+2] ;SIN(X+π)=SIN(-X)
FSBRI B,(4.0) ;SIN(X+2π)=SIN(X)
SKIPGE A↔MOVNS B ;SIN(-X) = -SIN(X).
;FOR -1 ≤ B ≤ +1 REPRESENTING -π/2 ≤ X ≤ +π/2,
;COMPUTE SINE(X) APPROXIMATION BY TAYLOR SERIES.
DAC B,C↔FMPR B,B
LAC A,[164475536722]↔FMP A,B
FAD A,[606315546346]↔FMP A,B
FAD A,[175506321276]↔FMP A,B
FAD A,[577265210360Y↔FP A,B
F"⊂ V∩ f#(∩Kc&h∀⊂ V!Eh'h_RεE∧f∩jεE!⊃g"⊂)Rg!giNVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVFEβ)ja)
j g,∀DDN`i!P∃ g#bS*εE!Sffbg∃⊂⊗VKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVFEαdc⊂__⊂≡⊂⊗⊂∞⊂_K_⊂*$⊃g⊂λ⊂⊗⊂/P,
,≥FEαi"j*T'⊂∀ U g∀,
P≡P,
∀!_∃PXWT-
a_V`L↔T-∃P→⊗`YKT-∃aTTTTJ]H]FB∧dc⊂⊗∨_P*∩"g⊂ U g∀,
P≡P(∩WY⊂⊗H j g
_Wl∀NFE∧dQ⊂,∨_H*$"gλ)$∀"
P≡VXK⊂ g"λ&$∀"
P≡P⊗Tcg∀,
FE∧dQ⊂,≡_K⊂*$"S⊂)$∀⊃∀P≡P⊗⊂ g⊃⊂&$∀⊃∀P≡Pλ)cg∀⊗∀FEβE∧`oWXPP⊂/oY⊂¬P!ooLPP"↔oZ⊂H"ooZCE∧f PD`V,αD]h$PeP*hλ*$"P⊂i#jfQg*⊂$S⊂ FE⊂j g_N∧f aSDa⊗⊂⊂DD]cQj⊂ a∀c⊂'cλ i#jSbg*εB∧a`fQDa⊗⊂⊂XDD]Rc⊂,≡/⊗YYK⊂*$"S⊂)"j∃i'⊂+Rj$↔↔εE∧h∪h_e∧B]`j S∀,∀P∂P,εEαd&&'Bb⊗⊂ BD]i`U"P)dQg⊗⊂)Qj⊂)$
"∀P≡H⊗XFEαa`ffαa⊗⊂ L∧D]dQ⊂ ←→↔→YV⊂∃$"g⊂∀"j*i∪⊂+dj∩εE∧cSmf aH V$ S#($P¬h'h_R.]D`U g∀,
P≡P(∩WYεEαfgk)RDaV∀∂_W_∨
D]c'T&P_W⊂$g⊂⊂FE∧aPfcDa⊂!DDNdiP P)c∀,
←_W_∂FE∧j∀- Db⊂⊗XDB]dc⊂⊂⊂∞⊂_K_⊗⊂*∩"g⊂)∩∀"∀P∂P_εEαc"+&BaV⊂!αD]a⊂∩iP)"T& abQ⊂!,PW_↔aβE∧j&⊂Db⊗⊂
"∀DDNl'i⊂∀dcg⊂∃dj$⊂∂⊂_W_λ$g"$P`j'iβEεE∧Q aP!"Kc&T⊂!⊗!βE∧f PP!V!¬c b⊂⊂V%a→Ef aP⊂V%`YEc"+&H V!FB∧c bλ!V!Q b⊂!K%a→S aP K%`YQ"+&P⊂V!FEαc b⊂⊂V!c⊂b⊂!V∩a_Kf⊂aP V∩`XKc⊃+⊂⊂ K!FE∧Q b⊂ K%a_Q&h⊂ K"FEεB∧j)'⊃Db⊗⊂XDD]Pd"aeH∨⊂_W⊂$g"∩a`j'TεE∧c∀a∧`Vλ$ f#∀$DD]Pj g∀⊂TP≡PT j S∀_W`JVh$WL∀FE∧Tedh#QDb∧DNf$∀"
P≡P⊗Tcg∀!
P$c⊂⊂∨_W_βE∧fgU')P BD]g"Q`j"P⊂g)kbTεE∧h∪h_e∧B]bl$UεE XN∧XZ~L_______∧B]Y/⊗LYFE L≥∧Y→LX_______αD]Y/YFEεB%a_≥αX[[~M~ZZ→M__DDNX↔_[M≠~ZZ\≤εE∩a_]∧L_→[≠≠_Z[[DD]M↔≠[→Y\Y~εE%a≥∧Y_≠~X→MYY≠XαD]YWX[→YMZ→~FB%a→]αY__ZM→≠≠→L→_DDNXW~~∞≠→XZL\εEεB%`X]αY_→≠LY≠→_M~→DDNYW≠X∞Y~[→
→εE%PY≥∧ZMZ_≠XLY~ZZ∧D]VMW_X≠
[__~
FE%`L]∧[_→[_≠L_≠[YBD]VX→≠~≠M≤≠→_εE"g⊃)⊂ j⊂g≥VVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVFBβ)ja)
j g⊗",V⊃,∀D]Pi!P*⊂g#bg∃⊂∀""S* VlK""f*⊂Vl∀FB!gffQg*⊂VVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVCEεE∞P'fbQ`P/P⊂j g→
,V,∀KεE∧lWoXPH,/oYβE∧f PfP,V⊂i#YS afP⊗⊗ i#LFE∧aPfg⊂,,Ke*Sh"P,K&→εEαa`ffλ,V,QgP&_CEεE≥R'i$m∪g* fλ*'PβKY≥P P)T,TH≡⊂ a∀T,∀WβE∧f PP⊂,V⊂i#YQ"+)⊂⊗V i#LFE∧h∃id⊂_MV,Kh∃id%⊂[V j⊂g∧D]Pi!j S∀,Wl
FE∧iRdh&⊂⊂i#XKT'h→%αD]XiU⊂∪⊂→∪"⊂(jPb) g∃)WεEαe*fh⊃bP,V⊗FE∧c∀a)⊂,K($Kh∪h→%.BD]Yi⊃⊂(j`Q) g*εE∧c⊂b)⊂,K($Kh∪h→%∧BD]Y'⊃⊂(j`Q) g*εEεE∞k"i*∩a`f⊂∃'PβWL≥P a∀T,∀P∂⊂ a)J,TWεB&_]∧S ag⊂⊗⊗ i#LKc"+∀⊂,⊗ T#YεEαh*idλ_[V,¬h*id∩⊂_[V⊂j g∧B]`i!U g∀,lTFEαiedh⊃P i#LcgmCE∧c)P⊂,V$⊂f#($Eh'h→∩.FE∧Q b)⊂⊗V$ f⊃($FE∪→≥∧h∪h→%εBεE"g⊃)⊂ j⊂g→≥VKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVFEεB)ja)
idg,∀D]Pi!P)Rg"WεB!gffQg*⊂VVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVCE∧`iRg∀,∀O`j g
,↔ihT*∀_VV/→∀TKεE∧cRk"g⊂XP∞⊂⊗⊂∞⊂∃LP)"j∃i'⊂⊗AWY⊂∞λ idg
,∀P∞λ∃CWYεEεB∧`oXHP!/LεE∧f⊂ag⊂ K,c&T)⊂ V⊗c b∀$P V
_W_∀CE∧e*Sh"P K-f aH V$ S#($DB]k`iH,⊂"dU$"i⊂XW_⊂∪i⊂_W∨FE∧Tedh#QP i#LKfgk∪)P KT'h_e↔FE∧aPf&∀)Ti*⊗ JFE∧f⊂aP!⊗⊗c"+∀⊂!⊗_Eb aP⊂⊗,∧]P`f!jS j"P⊗↔ihi∃∀_Vl↔→∀FEαcgP U g∧DB]a`f⊂jf j⊃P j S∀)hi∃∀_Vl↔→∀TFB"g")λ idg∞VVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVCEεE)Ua)∀ PgiV,
D]`i⊂P!giRg"WεB!gffQg*⊂VVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVCE∧`aSiT,∀OPβWYλ⊗P iRg∀,∀KεE∧cRk"g⊂XP∞⊂⊗⊂∞⊂∃LP)"j∃i'⊂_λ∞⊂ aSiT,∀H∞⊂∃CKεEεB∧a`f∪∀ idS⊗,∀FB∧fgk∪)P_KQ b)⊂V$ f⊃($FEαh'h_RεE"g⊃)⊂ aSi]VVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVVKVVVFB
;TITLE III - III DISPLAY SUBROUTINES - BGB - JANUARY 1973.
↓A←1↔↓B←2↔↓C←3
INTERN BUFDPY,DPYPTR
BUFDPY: .+2↔=100↔BLOCK =100
INTERN DPYBUF
DPYBUF: DPYBU.↔=2048
DPYBU.: BLOCK =2048
IGNORE: BLOCK 1
SIZBRT: BLOCK 1
DPYCOL: BLOCK 1
DPYPTR: BLOCK 1
BUFEND: BLOCK 1
BUFHD: BLOCK 2 ;UPG ARGUMENT. ;ADDRESS ↔ LENGTH.
DDSAVE: BLOCK 1
;VERNIER III TEXT POSITIONING.
VERNX ←← 14
VERNY ←← 11
;DISPLAY SAIL STRING.
DPYSST↑: POP 16,1↔POP 16,2↔SKIPGE IGNORE↔POPJ P,
HRRZS 2 ;LENGTH OF STRING.
JUMPLE 2,SSRET
ILDB 3,1
IDPB 3,DPYPTR
SOJG 2,.-2
SSRET: HRRZ 1,DPYPTR
CAML 1,BUFEND
SETOM IGNORE
POPJ P,
;SUBRS DPYSET,DPYBIG,DPYBRT ;Set buffer,char. size, brightness*
SUBR(DPYSET,BUFFER) ;Initialize a display buffer *
;____________________________________________________________________
LAC 1,BUFFER↔CDR 2,-1(1) ;BUFFER SIZE.
ADDI 2,-1(1)↔DAC 2,BUFEND
ADDI 1,2↔DAC 1,BUFHD ;POINT TO THIRD WORD.
SETZM IGNORE
SETZM SIZBRT
CLR2: LAC A,BUFHD ;BLIT THE BUFFER WITH THE III-TEXT OPCODE 1.
LACI B,1↔DAC B,1(A)
LACI B,2(A)↔LIPI B,1(A)
BLT B,@BUFEND
PUSH P,(P)↔GO LV3
ENDR DPYSET
SUBR(DPYBIG,SIZE) ;Set character size
;____________________________________________________________________
;USES AC 1
LAC A,SIZE↔DPB A,[POINT 3,SIZBRT,27] ;REMEMBER NEW SIZE
POP1J
ENDR DPYBIG
;____________________________________________________________________
SUBR(DPYBRT,SIZE) ;Set brightness
;USES AC 1
LAC A,SIZE↔DPB A,[POINT 3,SIZBRT,24] ;REMEMBER NEW BRIGHTNESS
POP1J
ENDR DPYBRT
;SUBRS AVECT,AIVECT,RVECT,RIVECT ;Vectors
COMMENT ⊗
The III display processor is a stored program computer,
these III subroutines make a III program using only two display
operations: the long vector operation and the text operation. The
pointer to the display buffer is always maintained as a BYTE POINTER
to the last character displayed. The flag named IGNORE is set when
display buffer overflow occurs and all further display calls are
ignored until the buffer is used. The III instruction formats are
given below, unlike most CPU (but like must display processors of
its day) the immediate data fields are in the left portion of the
instruction and the opcode in the right.
TEXT DISPLAY WORD: ASCII/ABCDE/ + 1
LONG VECTOR WORD: BYTE(11)X,Y(3)BRT,SIZ(7)OPCODE
The long vector opcodes appear in the following four lines: ⊗
SUBR(RIVECT)
GO RIV. ↔ENDR RIVECT
SUBR(RVECT)
GO RV. ↔ENDR RVECT
SUBR(AIVECT)
GO AIV. ↔ENDR AIVECT
SUBR(AVECT)
GO AV. ↔ENDR AVECT
;USES AC 1-3
;DTYO DEPENDS ON THIS
RIV.: SKIPA C,[046] ;RELATIVE INVISIBLE VECTOR.
RV.: LACI C, 006 ↔GO LV0 ;RELATIVE VISIBLE VECTOR.
AIV.: SKIPA C,[146] ;ABSOLUTE INVISIBLE VECTOR.
AV.: LACI C, 106 ;ABSOLUTE VISIBLE VECTOR.
SETZM DPYCOL ;RESET TAB LOCATION
LV0: SKIPGE IGNORE↔POP2J
LV: LAC A,-2(P)↔LAC B,-1(P) ;PICKUP X AND Y.
LVC: DPB A,[POINT 11,C,10] ;PACK X INTO III-WORD.
DPB B,[POINT 11,C,21] ;PACK Y INTO III-WORD.
SKIPE A,SIZBRT ;NEW BRIGHTNESS OR SIZE?
GO [ IOR C,A↔DZM SIZBRT↔GO LV2] ;YES, SET IT
LV2: AOS A,DPYPTR↔DAC C,(A) ;PACK WORD INTO III-BUFFER.
LV3: LIPI A,<(<POINT 7,0,35>)> ;UPDATE DPYPTR...
DAC A,DPYPTR↔LACI A,(A) ;WHICH IS A BYTE-POINTER.
CAML A,BUFEND↔SETOM IGNORE ;CHECK FOR BUFFER OVERFLOW.
POP2J
;SUBRS DPYSTR,DTYO,DPYOUT ;Output string,character, POG *
;--------------------------------------------------------------------
SUBR(DPYSTR,TEXT)
;USES AC 1,3
LAC 3,TEXT↔LIPI 3,440700
L1: ILDB 3↔JUMPE POP1J.
CALL(DTYO,0)↔GO L1
ENDR DPYSTR;---------------------------------------------------------
SUBR(DTYO,CHAR)
;USES AC 1
;DPYSTR DEPENDS ON DTYO NOT CLOBBERING 3
SKIPE SIZBRT
GO [ PUSHP 0↔PUSHP 2↔PUSHP 3
CALL(RIVECT,[0],[0])
POPP 3↔POPP 2↔POPP 0
GO .+1]
LAC 1,CHAR
CAIN 1,15↔DOM DPYCOL
CAIN 1,11↔GO DOTAB
DTYO1: IDPB 1,DPYPTR↔AOS DPYCOL
CDR 1,DPYPTR↔CAML 1,BUFEND
DOM IGNORE↔POP1J
DOTAB: CALL(DTYO,[" "]) ;We got a tab, put out spaces until
LAC 1,DPYCOL ;column is divisible by 8
TRNE 1,7↔GO DOTAB
CDR 1,DPYPTR
POP1J
ENDR DTYO;-----------------------------------------------------------
SUBR(DPYOUT,POG)
COMMENT ⊗------------------------------------------------------------
⊗↔ SKIPN A,BUFHD↔GO L1
LAC 2,DPYPTR↔DAC 2,-2(1)
LACI 2,2(2)↔SUB 2,1↔DAC 2,-1(1)
L1: CDR B,DPYPTR↔SUB B,BUFHD ;BUFFER LENGTH.
AOS B↔DAC B,BUFHD+1
LACM A,POG↔DPB A,[POINT 4,UPGOP,12] ;GLASS TO AC FIELD.
XCT UPGOP
POP1J
UPGOP: 703B8+BUFHD
ENDR DPYOUT;---------------------------------------------------------
;SUBRS OCTDPY,DECDPY,FLODPY ;Numeric display *
;--------------------------------------------------------------------
SUBR(OCTDPY,INTEGER) ;OCTAL NUMBER DISPLAY.
Q←15 ↔ N←13
JFCL↔GO L2
LAC 14,INTEGER↔LAC Q,[POINT 3,14,-1]↔LACI N,6
L1: ILDB Q↔IORI 60↔CALL(DTYO,0)↔SOJG N,L1
CALL(DTYO,[" "])
L2: LAC 14,INTEGER↔LAC Q,[POINT 3,14,17]↔LACI N,6
L3: ILDB Q↔IORI 60↔CALL(DTYO,0)↔SOJG N,L3
POP1J
ENDR OCTDPY;3/25/73(BGB)---------------------------------------------
DECDPY↑:;(INTEGER) ;DECIMAL NUMBER DISPLAY.
BEGIN DECDPY
LAC 1,ARG1↔POP P,-1(P) ;FETCH ARG AND LAC RET. ADR.
L1: JUMPGE 1,L2 ;TEST FOR NEGATIVE NUMBER.
MOVM 2,1↔CALL(DTYO,["-"]) ;PRINT MINUS SIGN.
LAC 1,2
L2: IDIVI 1,12↔PUSH P,2 ;MODULO TEN AND SAVE.
SKIPE 1↔PUSHJ P,L2 ;TEST FOR DONE.
POP P,1↔ADDI 1,60↔CALL(DTYO,1) ;RESTORE & PRINT.
POPJ P,
BEND DECDPY;12/17/72(BGB)--------------------------------------------
SUBR(FLODPY,FLONUM,PLACES) ;FLOATING NUMBER DISPLAY.
LAC FLONUM
JUMPL[CALL(DTYO,["-"])↔LACM FLONUM↔GO .+1]
LACM 2,PLACES↔CAILE 2,6↔LACI 2,6↔DAC 2,PLACES
FMPR[1.↔10.↔100.↔1000.↔10000.↔100000.↔1000000.](2)↔FIXX
IDIV[=1↔=10↔=100↔=1000↔=10000↔=100000↔=1000000](2)
PUSHP 1↔CALL(DECDPY,0)↔POPP 0
LAC 2,PLACES
ADD[=1↔=10↔=100↔=1000↔=10000↔=100000↔=1000000](2)
PUSHP DPYPTR↔CALL(DECDPY,0)↔POPP 1
LACI "."↔IDPB 0,1
POP2J
ENDR FLODPY;12/17/72(BGB)--------------------------------------------
END